package com.eedi.framework.org.service;

import cn.hutool.core.util.ObjUtil;
import com.eedi.framework.org.controller.sys.vo.config.*;
import com.eedi.framework.common.exception.util.PreconditionsUtils;
import com.eedi.framework.common.util.object.BeanUtils;
import com.eedi.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.eedi.framework.org.controller.sys.vo.config.*;
import com.eedi.framework.org.convert.SysOrgConfigConvert;
import com.eedi.framework.org.dal.dataobject.SysOrgConfigGuidanceDO;
import com.eedi.framework.org.dal.dataobject.SysOrgConfigLinksDO;
import com.eedi.framework.org.dal.dataobject.SysOrgConfigPlacardDO;
import com.eedi.framework.org.dal.mapper.SysOrgConfigGuidanceMapper;
import com.eedi.framework.org.dal.mapper.SysOrgConfigLinksMapper;
import com.eedi.framework.org.dal.mapper.SysOrgConfigMapper;
import com.eedi.framework.org.dal.mapper.SysOrgConfigPlacardMapper;
import com.eedi.framework.org.enmus.SysOrgConfigErrorCodeConstants;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.List;

/**
 * 机构配置 Service 实现类
 *
 *  @author 永聚长青源码
 *
 */
@Service
@Validated
public class SysOrgConfigServiceImpl implements SysOrgConfigService{

    @Resource
    private SysOrgConfigMapper sysOrgConfigMapper;

    @Resource
    private SysOrgConfigPlacardMapper sysOrgConfigPlacardMapper;

    @Resource
    private SysOrgConfigLinksMapper sysOrgConfigLinksMapper;

    @Resource
    private SysOrgConfigGuidanceMapper sysOrgConfigGuidanceMapper;

    @Override
    public SysOrgConfigResp get() {
        return sysOrgConfigMapper.get();
    }

    @Override
    public void setup(SysOrgConfigReq createReqVO) {
        SysOrgConfigResp sysOrgConfigResp =  sysOrgConfigMapper.get();
        if (ObjUtil.isNotNull(sysOrgConfigResp)){
            sysOrgConfigMapper.setup(sysOrgConfigResp.getOrgConfigId(),createReqVO);
            return;
        }
        sysOrgConfigMapper.insertOrgConfig(createReqVO);
    }

    @Override
    public String createPlacard(SysOrgConfigPlacardReq createReqVO) {
        SysOrgConfigPlacardDO sysOrgConfigPlacardDO = BeanUtils.toBean(createReqVO, SysOrgConfigPlacardDO.class);
        sysOrgConfigPlacardMapper.insert(sysOrgConfigPlacardDO);
        return sysOrgConfigPlacardDO.getOrgConfigPlacardId();
    }

    @Override
    public void updatePlacard(SysOrgConfigPlacardUpdateReq updateReqVO) {
        PreconditionsUtils.checkArgument(null != updateReqVO.getOrgConfigId(), SysOrgConfigErrorCodeConstants.SYS_ORG_CONFIG_PLACARD_ID_NOT_EXISTS);
        SysOrgConfigPlacardDO updateObj = BeanUtils.toBean(updateReqVO, SysOrgConfigPlacardDO.class);
        this.sysOrgConfigPlacardMapper.updateById(updateObj);
    }

    @Override
    public void deletePlacardById(String orgConfigPlacardId) {

        this.sysOrgConfigPlacardMapper.deleteById(orgConfigPlacardId);
    }

    @Override
    public List<SysOrgConfigPlacardResp> listPlacardsByOrgConfigId(String orgConfigId) {
        List<SysOrgConfigPlacardDO> lists = this.sysOrgConfigPlacardMapper.selectList(new LambdaQueryWrapperX<SysOrgConfigPlacardDO>()
                .likeIfPresent(SysOrgConfigPlacardDO::getOrgConfigId, orgConfigId)
                .orderByAsc(SysOrgConfigPlacardDO::getPlacardSort));
        return SysOrgConfigConvert.INSTANCE.convertListSysOrgConfigPlacardResp(lists);
    }

    @Override
    public SysOrgConfigPlacardResp getByPlacardId(String orgConfigId, String orgConfigPlacardId) {
        SysOrgConfigPlacardDO sysOrgConfigPlacardDO = this.sysOrgConfigPlacardMapper.selectByPlacardId(orgConfigId,orgConfigPlacardId);
        return SysOrgConfigConvert.INSTANCE.convert(sysOrgConfigPlacardDO);
    }

    @Override
    public String createLinks(SysOrgConfigLinksReq createReqVO) {
        SysOrgConfigLinksDO sysOrgConfigLinksDO = BeanUtils.toBean(createReqVO, SysOrgConfigLinksDO.class);
        sysOrgConfigLinksMapper.insert(sysOrgConfigLinksDO);
        return sysOrgConfigLinksDO.getOrgConfigLinksId();
    }

    @Override
    public void updateLinks(SysOrgConfigLinksUpdateReq updateReqVO) {
        SysOrgConfigLinksDO updateObj = BeanUtils.toBean(updateReqVO, SysOrgConfigLinksDO.class);
        this.sysOrgConfigLinksMapper.updateById(updateObj);
    }

    @Override
    public void deleteLinksById(String orgConfigLinksId) {

        this.sysOrgConfigLinksMapper.deleteById(orgConfigLinksId);
    }

    @Override
    public List<SysOrgConfigLinksResp> listLinksByOrgConfigId(String orgConfigId) {

        List<SysOrgConfigLinksDO> lists = this.sysOrgConfigLinksMapper.selectList(new LambdaQueryWrapperX<SysOrgConfigLinksDO>()
                .likeIfPresent(SysOrgConfigLinksDO::getOrgConfigId, orgConfigId)
                .orderByAsc(SysOrgConfigLinksDO::getLinksSort));
        return SysOrgConfigConvert.INSTANCE.convertListSysOrgConfigLinksResp(lists);
    }

    @Override
    public SysOrgConfigLinksResp getByLinksId(String orgConfigId, String orgConfigLinksId) {
        SysOrgConfigLinksDO sysOrgConfigLinksDO = this.sysOrgConfigLinksMapper.selectByLinksId(orgConfigId,orgConfigLinksId);
        return SysOrgConfigConvert.INSTANCE.convert(sysOrgConfigLinksDO);
    }

    @Override
    public String createGuidance(SysOrgConfigGuidanceReq createReqVO) {
        SysOrgConfigGuidanceDO sysOrgConfigGuidanceDO = BeanUtils.toBean(createReqVO, SysOrgConfigGuidanceDO.class);
        sysOrgConfigGuidanceMapper.insert(sysOrgConfigGuidanceDO);
        return sysOrgConfigGuidanceDO.getOrgConfigGuidanceId();
    }

    @Override
    public void updateGuidance(SysOrgConfigGuidanceUpdateReq updateReqVO) {
        SysOrgConfigGuidanceDO updateObj = BeanUtils.toBean(updateReqVO, SysOrgConfigGuidanceDO.class);
        this.sysOrgConfigGuidanceMapper.updateById(updateObj);
    }

    @Override
    public void deleteGuidanceById(String orgConfigGuidanceId) {

        this.sysOrgConfigGuidanceMapper.deleteById(orgConfigGuidanceId);
    }

    @Override
    public List<SysOrgConfigGuidanceResp> listGuidancesByOrgConfigId(String orgConfigId) {
        List<SysOrgConfigGuidanceDO> lists = this.sysOrgConfigGuidanceMapper.selectList(new LambdaQueryWrapperX<SysOrgConfigGuidanceDO>()
                .likeIfPresent(SysOrgConfigGuidanceDO::getOrgConfigId, orgConfigId)
                .orderByAsc(SysOrgConfigGuidanceDO::getGuidanceSort));
        return SysOrgConfigConvert.INSTANCE.convertListSysOrgConfigGuidanceResp(lists);
    }

    @Override
    public SysOrgConfigGuidanceResp getByGuidanceId(String orgConfigId, String orgConfigGuidanceId) {
        SysOrgConfigGuidanceDO sysOrgConfigGuidanceDO = this.sysOrgConfigGuidanceMapper.selectByGuidanceId(orgConfigId,orgConfigGuidanceId);
        return SysOrgConfigConvert.INSTANCE.convert(sysOrgConfigGuidanceDO);
    }

    @Override
    public SysOrgConfigAllResp getAllDetails() {
        SysOrgConfigResp sysOrgConfigResp = get();
        PreconditionsUtils.checkNotNull(sysOrgConfigResp,SysOrgConfigErrorCodeConstants.SYS_ORG_CONFIG_NOT_EXISTS);
        List<SysOrgConfigPlacardResp> palacardList = listPlacardsByOrgConfigId(sysOrgConfigResp.getOrgConfigId());
        List<SysOrgConfigLinksResp> linkList = listLinksByOrgConfigId(sysOrgConfigResp.getOrgConfigId());
        List<SysOrgConfigGuidanceResp> guidanceList = listGuidancesByOrgConfigId(sysOrgConfigResp.getOrgConfigId());
        SysOrgConfigAllResp sysOrgConfigAllResp = new SysOrgConfigAllResp();
        sysOrgConfigAllResp.setSysOrgConfigResp(sysOrgConfigResp);
        sysOrgConfigAllResp.setSysOrgConfigPlacardResps(palacardList);
        sysOrgConfigAllResp.setSysOrgConfigLinksResps(linkList);
        sysOrgConfigAllResp.setSysOrgConfigGuidanceResps(guidanceList);
        return sysOrgConfigAllResp;
    }
}
